package 爬虫;

import java.io.BufferedInputStream;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.LinkedHashSet;
import java.util.Scanner;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 爬虫类
 */
public class Spider {

    public String crawling(Product product) {
        StringBuffer sb = new StringBuffer();//缓存字符串,用于字符串的快速拼接
        String url = "http://nc.mofcom.gov.cn/channel/gxdj/jghq/jg_list.shtml";//目标网站位置
        //开始拼接请求参数信息
        url += "?endTime=" + product.getEndTime();//终止时间
        url += "&startTime=" + product.getStartTime();//起始时间
        url += "&par_p_index=" + product.getPar_p_index();//市场省份位置
        url += "&p_index=" + product.getP_index();//市场详细位置
        url += "&par_craft_index=" + product.getPar_craft_index();//产品类别
        url += "&craft_index=" + product.getCraft_index();//产品编号
        url += "&page=" + product.getPage();//当前页码

        String html = downLoadUrl(url);//获取目标html代码

        String table = parseHtml(html, SpiderRegex.TABLE_URL, 1);//获取表格
        String tbody = parseHtml(table, SpiderRegex.TABLE_TBODY, 1);//获取表格内容
        Set<String> trs = parseHtml(tbody, SpiderRegex.TABLE_TR);//获取表格中每行的内容
        for (String tr : trs) {
            Set<String> tds = parseHtml(tr, SpiderRegex.TABLE_TD);//获取每行中每列的内容
            for (String td : tds) {
                td = td.replaceAll("\t", "").replaceAll(" ", "");//将列中的制表符和空格都去除
                Set<String> mark = parseHtml(td, SpiderRegex.TABLE_TD_NONE);//查看是否为不处理数据
                if (mark.size() > 0) {//说明为不处理数据,跳过该次循环
                    continue;
                }
                String addr = parseHtml(td, SpiderRegex.TABLE_TD_ADDR, 1);//获取地址
                if (null != addr && !"".equals(addr)) {
                    td = addr;//获取地址成功
                }
                sb.append(td + "\t");//添加该列信息
            }
            sb.append("\n");//添加换行符
        }
        return sb.toString();
    }


    public String getGbl(Product product) {
        StringBuffer sb = new StringBuffer();//缓存字符串,用于字符串的快速拼接
        String url = "https://www.dongchedi.com/motor/pc/sh/sh_sku_list?aid=1839&app_name=auto_web_pc";//目标网站位置
        //开始拼接请求参数信息


        String html = downLoadUrl(url);//获取目标html代码

        String table = parseHtml(html, SpiderRegex.TABLE_URL, 1);//获取表格
        String tbody = parseHtml(table, SpiderRegex.TABLE_TBODY, 1);//获取表格内容
        Set<String> trs = parseHtml(tbody, SpiderRegex.TABLE_TR);//获取表格中每行的内容
        for (String tr : trs) {
            Set<String> tds = parseHtml(tr, SpiderRegex.TABLE_TD);//获取每行中每列的内容
            for (String td : tds) {
                td = td.replaceAll("\t", "").replaceAll(" ", "");//将列中的制表符和空格都去除
                Set<String> mark = parseHtml(td, SpiderRegex.TABLE_TD_NONE);//查看是否为不处理数据
                if (mark.size() > 0) {//说明为不处理数据,跳过该次循环
                    continue;
                }
                String addr = parseHtml(td, SpiderRegex.TABLE_TD_ADDR, 1);//获取地址
                if (null != addr && !"".equals(addr)) {
                    td = addr;//获取地址成功
                }
                sb.append(td + "\t");//添加该列信息
            }
            sb.append("\n");//添加换行符
        }
        return sb.toString();
    }

    /**
     * 拉取页面html代码
     *
     * @param addr
     * @return
     */
    private String downLoadUrl(String addr) {
        StringBuffer sb = new StringBuffer();//缓存字符串,用于字符串的快速拼接
        try {
            URL url = new URL(addr);
            HttpURLConnection con = (HttpURLConnection) url.openConnection();//打开连接工具
            con.setConnectTimeout(5000);//设置超时时间
            con.connect();//建立连接
            if (con.getResponseCode() == 200) {//如果响应码为200,说明连接成功
                BufferedInputStream bis = new BufferedInputStream(con.getInputStream());
                Scanner sc = new Scanner(bis);
                while (sc.hasNextLine()) {
                    sb.append(sc.nextLine());//存储html信息
                }
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return sb.toString();
    }

    /**
     * 解析方法
     *
     * @param html
     * @param regex
     * @return 返回一个集合
     */
    private Set<String> parseHtml(String html, String regex) {
        Set<String> result = new LinkedHashSet<String>();
        //创建一个Pattern模式类,编译这个正则表达式
        Pattern p = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
        //定义一个匹配的类
        Matcher matcher = p.matcher(html);
        while (matcher.find()) {
            result.add(matcher.group(1));
        }
        return result;
    }

    /**
     * 重载解析方法
     *
     * @param html
     * @param regex
     * @param index 组的索引
     * @return 返回特定组
     */
    private String parseHtml(String html, String regex, int index) {
        String result = "";
        //创建一个Pattern模式类,编译这个正则表达式
        Pattern p = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
        //定义一个匹配的类
        Matcher matcher = p.matcher(html);
        while (matcher.find()) {
            if (index < 0 || index > matcher.groupCount()) {//容错处理
                return "";
            }
            result = matcher.group(index);
        }
        return result;
    }
}
